﻿// Study1019.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 第十章 STL库和泛型设计 算法 排序和搜索

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
int main()
{
	int iarray[] = { 26,17,15,22,23,33,32,40 };
	vector<int> vec(iarray, iarray + sizeof(iarray) / sizeof(int));

	//查找并输出第一个最大元素及其位置
	const vector<int>::iterator p = max_element(vec.begin(), vec.end());
	int n = p - vec.begin();
	cout << "max element:" << *p << " found at " << n << endl;

	//局部排序并复制到别处
	vector<int> vec1(5);
	partial_sort_copy(vec.begin(), vec.end(), vec1.begin(), vec1.end());
	copy(vec1.begin(), vec1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;

	//排序，默认递增
	sort(vec.begin(), vec.end());
	copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
	cout << endl;

	//返回小于等于24和大于等于24的元素位置
	cout << *lower_bound(vec.begin(), vec.end(), 24) << endl;
	cout << *upper_bound(vec.begin(), vec.end(), 24) << endl;

	//对于有序区间，可以用二分查找方法寻找某个元素
	cout << binary_search(vec.begin(), vec.end(), 33) << endl;

	//合并两个序列vec和vec1，并将结果放到vec2中
	vector<int> vec2(13);
	merge(vec.begin(), vec.end(), vec1.begin(), vec1.end(), vec2.begin());
	copy(vec2.begin(), vec2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	//将小于*（vec.begin（）+5）的元素放置在该元素之左，其余置于该元素之右，不保证维持原有的相对位置。
	nth_element(vec2.begin(), vec2.begin() + 5, vec2.end());
	copy(vec2.begin(), vec2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	//排序，并保持原来的相对位置
	stable_sort(vec2.begin(), vec2.end());
	copy(vec2.begin(), vec2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	//合并两个有序数列，然后将结构保存到原区间内
	int iarray3[] = { 1,3,5,7,2,4,6,8 };
	vector<int> vec3(iarray3, iarray3 + sizeof(iarray3) / sizeof(int));
	inplace_merge(vec3.begin(), vec3.begin() + 4, vec3.end());
	copy(vec3.begin(), vec3.end(), ostream_iterator<int>(cout, " "));
	cout << endl;

	//以字典顺序比较vec3和vec4
	int iarray4[] = { 1,3,5,7,1,5,9,3 };
	vector<int> vector4(iarray4, iarray4 + sizeof(iarray4) / sizeof(int));
	cout << lexicographical_compare(vec3.begin(), vec3.end(), vector4.begin(), vector4.end()) << endl;

	return 0;


}


